home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
music
/
eked-m1.zoo
/
src
/
load.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-19
|
8KB
|
283 lines
/*
* EKED-M1 : Editor for Korg M1 synth; load.c : load/save/print routines
* Copyright (C) 1995 Steven M. Eker (Steven.Eker@brunel.ac.uk)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <gemfast.h>
#include <aesbind.h>
#include "eked-m1.h"
#include "gm/gem_man.h"
#include "defs.h"
#include "types.h"
#include "midi.h"
#include "externs.h"
static FILE *fp;
static BYTE buf[AD_SIZE];
static BOOL find_pat(int pat[], int size);
static int print_names(BYTE *data, int size, int one);
void load_bank(BANK *bank)
{
static int header[] = {SYSEX, KORG_ID, FORMAT_ID, M1_ID};
char *name = fm_file_select("LOAD BANK", "*.BNK", "");
long size;
int lseq;
BOOL glob_change, comb_change, prog_change;
if(!name)
return;
BEG_BUSY;
fp = fopen(name, "rb");
if(!fp){
fm_alert(1, OPEN_ALERT);
END_BUSY;
return;
}
glob_change = comb_change = prog_change = FALSE;
for(;;){
if(!find_pat(header, 4))
break;
switch(getc(fp)){
case GLOBAL_DATA_DUMP:
(void) getc(fp); /* skip bank flag */
if(fread(buf, sizeof(char), (size_t) GD_SIZE, fp) !=
GD_SIZE){
fm_alert(1, READ_ALERT);
goto clean_up;
}
korg2byte(bank->data, buf, GLOBAL_SIZE);
glob_change = TRUE;
break;
case ALL_COMB_DUMP:
lseq = getc(fp) & 2;
size = lseq ? CD50_SIZE : CD_SIZE;
if(fread(buf, sizeof(char), (size_t) size, fp) != size){
fm_alert(1, READ_ALERT);
goto clean_up;
}
korg2byte(bank->data + GLOBAL_SIZE, buf,
lseq ? (50 * COMBINATION_SIZE) :(100 * COMBINATION_SIZE));
comb_change = TRUE;
break;
case ALL_PROG_DUMP:
lseq = getc(fp) & 2;
size = lseq ? PD50_SIZE : PD_SIZE;
if(fread(buf, sizeof(char), (size_t) size, fp) != size){
fm_alert(1, READ_ALERT);
goto clean_up;
}
korg2byte(bank->data + PROGRAM_OFFSET, buf,
lseq ? (50 * PROGRAM_SIZE) : (100 * PROGRAM_SIZE));
prog_change = TRUE;
break;
case ALL_DATA_DUMP:
lseq = getc(fp) & 2;
size = lseq ? AD50_SIZE : AD_SIZE;
(void) getc(fp); (void) getc(fp); /* skip seq data size */
if(fread(buf, sizeof(char), (size_t) size, fp) != size){
fm_alert(1, READ_ALERT);
goto clean_up;
}
if(lseq){
korg2byte(buf, buf, /* in place conversion */
(GLOBAL_SIZE + 50 * (COMBINATION_SIZE + PROGRAM_SIZE)));
memcpy(bank->data, buf,
(size_t) (GLOBAL_SIZE + 50 * COMBINATION_SIZE));
memcpy(bank->data + PROGRAM_OFFSET,
buf + (GLOBAL_SIZE + 50 * COMBINATION_SIZE),
50 * PROGRAM_SIZE);
}
else{
korg2byte(bank->data, buf,
(GLOBAL_SIZE + 100 * (COMBINATION_SIZE + PROGRAM_SIZE)));
}
glob_change = comb_change = prog_change = TRUE;
break;
}
}
clean_up:
fclose(fp);
strcpy(bank->filename, name);
END_BUSY;
if(comb_change && bank->comb_win != 0)
wm_update(bank->comb_win);
if(prog_change && bank->prog_win != 0)
wm_update(bank->prog_win);
}
static BOOL find_pat(int pat[], int size)
{
int c, i = 0;
for(;;){
c = getc(fp);
if(c == EOF)
return FALSE;
if(c == pat[i]){
i++;
if(i == size)
break;
}
else
i = (c == pat[0]) ? 1 : 0;
}
return TRUE;
}
void save_bank(BANK *bank, int fsel)
{
static char header[] = {SYSEX, KORG_ID, FORMAT_ID, M1_ID};
char *name;
if(fsel || bank->filename[0] == '\0'){
name = fm_file_select("SAVE BANK", "*.BNK", bank->filename);
if(!name)
return;
}
else
name = bank->filename;
BEG_BUSY;
fp = fopen(name, "wb");
if(!fp){
fm_alert(1, OPEN_ALERT);
END_BUSY;
return;
}
if(!iszero(bank->data, (size_t) GLOBAL_SIZE)){
byte2korg(buf, bank->data, GLOBAL_SIZE);
fwrite(header, sizeof(char), (size_t) 4, fp);
putc(GLOBAL_DATA_DUMP, fp);
putc(0x0, fp);
fwrite(buf, sizeof(char), (size_t) GD_SIZE, fp);
if(putc(EOX, fp) == EOF){
fm_alert(1, WRITE_ALERT);
goto clean_up;
}
}
if(!iszero(bank->data + GLOBAL_SIZE, (size_t) (100 * COMBINATION_SIZE))){
byte2korg(buf, bank->data + GLOBAL_SIZE, 100 * COMBINATION_SIZE);
fwrite(header, sizeof(char), (size_t) 4, fp);
putc(ALL_COMB_DUMP, fp);
putc(0x0, fp);
fwrite(buf, sizeof(char), (size_t) CD_SIZE, fp);
if(putc(EOX, fp) == EOF){
fm_alert(1, WRITE_ALERT);
goto clean_up;
}
}
if(!iszero(bank->data + PROGRAM_OFFSET, (size_t) (100 * PROGRAM_SIZE))){
byte2korg(buf, bank->data + PROGRAM_OFFSET, 100 * PROGRAM_SIZE);
fwrite(header, sizeof(char), (size_t) 4, fp);
putc(ALL_PROG_DUMP, fp);
putc(0x0, fp);
fwrite(buf, sizeof(char), (size_t) PD_SIZE, fp);
if(putc(EOX, fp) == EOF){
fm_alert(1, WRITE_ALERT);
goto clean_up;
}
}
clean_up:
fclose(fp);
if(name != bank->filename)
strcpy(bank->filename, name);
END_BUSY;
}
void print_bank(BANK *bank, int n, char *name, int flags)
{
static char filename[FILE_SPEC_SIZE];
int t;
char *b, *d;
BOOL print_comb;
if(!name){
strcpy(filename, bank->filename);
d = strrchr(filename, '.');
if(d != NULL && ((b = strrchr(filename, '\\')) == NULL || b < d))
strcpy(d + 1, "TXT");
else
strcat(filename, ".TXT");
name = fm_file_select("PRINT BANK", "*.TXT", filename);
if(!name)
return;
}
BEG_BUSY;
fp = fopen(name, "w");
if(!fp){
fm_alert(1, OPEN_ALERT);
END_BUSY;
return;
}
print_comb = (flags & TX_COMB) &&
!iszero(bank->data + GLOBAL_SIZE, (size_t) (100 * COMBINATION_SIZE));
if(print_comb){
fprintf(fp, "<<< BANK %d (%s) COMBINATIONS >>>\n", n, bank->filename);
t = print_names(bank->data + GLOBAL_SIZE,
COMBINATION_SIZE, flags & TX_ONE);
if(t < 0){
fm_alert(1, WRITE_ALERT);
goto clean_up;
}
}
if((flags & TX_PROG) &&
!iszero(bank->data + PROGRAM_OFFSET, (size_t) (100 * PROGRAM_SIZE))){
if(print_comb)
putc('\n', fp);
fprintf(fp, "<<< BANK %d (%s) PROGRAMS >>>\n", n, bank->filename);
t = print_names(bank->data + PROGRAM_OFFSET, PROGRAM_SIZE, flags & TX_ONE);
if(t < 0){
fm_alert(1, WRITE_ALERT);
goto clean_up;
}
}
clean_up:
fclose(fp);
END_BUSY;
}
static int print_names(BYTE *data, int size, int one)
{
static char buf[11];
int i, j, t;
if(one){
for(i = 0; i <= 99; i++){
korg2str(buf, data, (size_t) 10);
t = fprintf(fp, "%02d %s\n", i, buf);
if(t < 0)
return t;
data += size;
}
}
else{
for(i = 0; i <= 19; i++){
for(j = 0; j <= 80; j += 20){
korg2str(buf, data + (i + j) * size, (size_t) 10);
t = fprintf(fp, "%02d %s%c", i + j, buf, (j == 80 ? '\n' : '\t'));
if(t < 0)
return t;
}
}
}
return 0;
}